<?php
if(!defined('BASE_DIR'))die('Cannot access the file !');
/**
 * -+-----------------------------------------
 * |PHP Framework
 * |Copyright (c) 2010 jinke.[iblue.cc]
 * |E-mail: mejinke@gmail.com
 * |Date: 2010-03-20
 * -+-----------------------------------------
 *
 * 系统注册类
 * 代替了原有的 _Class() 部份功能
 * @author jinke
 */
class Registry
{

	//对象池
	public static $objects;

	//当对象存在时，是否继续创建覆盖 ?
	public static $reset_obj = false;

    /**
     * 创建一个对象并注册
     * @param string	$key        键名
     * @param string	$classname  类名
     * @param array	$args        类实例化参数列表
     * @param bool	$sys       是否为系统类
     * @param string	$dir        类所在的目录
     * @param bool	$error     是否开启错误提示
     */
	public static function create($key,$classname = '',$args = array(),$sys = true,$error = true)
	{
		//检测该 $key 是否已注册存在
		if (isset(self::$objects[$key]))
		{
			if(self::$reset_obj===false)
				return self::$objects[$key];
		}

        //如果类名称为空，则尝试$key作为类名
		if ($classname == '')
			$classname = $key;

		//检测 类的类型（系统或用户自定义）
		if($sys)
		{
			$file = FRAMEWORK_LIB_DIR.$classname.'.class.php';
			$_class = $classname;
		}
		else
		{
			$file = EXTEND_LIB_DIR.$classname.'.php';
			$_class = $classname;
		}

		//引入类文件
		if(is_file($file))
			require_once $file;
		elseif($error)
			message_error('Load File','无法加载文件！',$file);

			switch (count($args))
			{
				case 0:
					self::$objects[$key] = new $_class();
					break;
				case 1:
					self::$objects[$key] = new $_class($args[0]);
					break;
				case 2:
					self::$objects[$key] = new $_class($args[0],$args[1]);
					break;
				case 3:
					self::$objects[$key] = new $_class($args[0],$args[1],$args[2]);
					break;
				case 4:
					self::$objects[$key] = new $_class($args[0],$args[1],$args[2],$args[3]);
					break;
				case 5:
					self::$objects[$key] = new $_class($args[0],$args[1],$args[2],$args[3],$args[4]);
					break;

				default:
					errorMsg('Create object','args must <= 5');
			}

		return self::$objects[$key];
	}


	/**
	 * 注册一个对象 总是覆盖
	 * @param $key    键名
	 * @param $value  值
	 */
  	public static function set($key,&$value)
	{
		self::$objects[$key]=$value;
		return self::get($key);
	}


	/**
	 * 注册一个对象 总是不覆盖
	 * @param $key    键名
	 * @param $value  值
	 */
	public static function add($key,$value)
	{
		if (!isset(self::$objects[$key]))
			self::$objects[$key]=$value;
		return self::get($key);
	}
	
	
	public static function adds($key,$value)
	{
		self::$objects[$key][] = $value;
		return self::get($key);
	}


	/**
	 * 获取一个已注册的对象
	 * @param $key   键名
	 */
	public static function get($key)
	{
		if (isset(self::$objects[$key]))
			return self::$objects[$key];
		else
			return false;
	}

}
?>
